package es.tikitaka.actions.usuarios;

import java.util.List;
import java.util.Set;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.faces.FacesMessages;

import es.tikitaka.dao.ComiteService;
import es.tikitaka.dao.EqMantenimientoService;
import es.tikitaka.dao.MunicipioDicService;
import es.tikitaka.dao.PerfilDicService;
import es.tikitaka.dao.ProvinciaDicService;
import es.tikitaka.dao.UsuarioService;
import es.tikitaka.dictionary.MunicipioDic;
import es.tikitaka.dictionary.PerfilDic;
import es.tikitaka.dictionary.ProvinciaDic;
import es.tikitaka.domain.usuarios.Comite;
import es.tikitaka.domain.usuarios.EqMantenimiento;
import es.tikitaka.domain.usuarios.Usuario;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("usuarioSearch")
@Scope(ScopeType.CONVERSATION)
public class UsuarioSearch {

	private int modo;

	private String buscar;
	private int en;
	private ProvinciaDic provincia;
	private MunicipioDic municipio;
	private PerfilDic perfil;
	private Usuario usuarioElim;

	private int totalRes;

	private List<ProvinciaDic> listaProvincias;
	private List<MunicipioDic> listaMunicipios;
	private List<PerfilDic> listaPerfiles;

	@DataModel("usuarios")
	private List<Usuario> usuarios;
	@DataModelSelection("usuarios")
	private Usuario usuarioItem;

	@In(create = true)
	private UsuarioService usuarioService;

	@In(create = true)
	private ProvinciaDicService provinciaService;

	@In(create = true)
	private MunicipioDicService municipioService;

	@In(create = true)
	private PerfilDicService perfilService;

	@In(create = true)
	private ComiteService comiteService;

	@In(create = true)
	private EqMantenimientoService eqMantenimientoService;

	/**
	 * Constructor por defecto
	 */
	public UsuarioSearch() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de eliminar
	 */
	public void modoEliminar() {
		modo = 1;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de edición
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoEdicion() {
		modo = 2;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de consulta
	 */
	public void modoConsulta() {
		modo = 3;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que carga las opciones en la pantalla de búsqueda de usuario
	 */
	public void cargaOpcionesBusqueda() {
		listaProvincias = provinciaService.getList();
		listaPerfiles = perfilService.getList();
		en = 1;
	}

	/**
	 * Método para buscar usuarios según unos criterios de consulta
	 */
	public void busca() {

		StringBuffer s = new StringBuffer();

		s
				.append("select u from Usuario u left join fetch u.perfil f left join fetch u.provincia p left join fetch u.municipio m where 1 = 1 ");

		if (buscar != null && buscar.length() > 0) {
			if (en == 1) {
				// busca en apellidos
				s.append("and upper(u.apellidos) like upper('%'||?1||'%') ");
			} else if (en == 2) {
				// busca en nombre
				s.append("and upper(u.nombre) like upper('%'||?1||'%') ");
			} else if (en == 3) {
				// busca en nombre de usuario
				s.append("and upper(u.username) like upper('%'||?1||'%') ");
			}
		}
		if (perfil != null) {
			s.append("and f.id = ?2 ");
		}
		if (provincia != null) {
			s.append("and p.id = ?3 ");
		}
		if (municipio != null) {
			s.append("and m.id = ?4 ");
		}

		s.append("order by u.apellidos, u.nombre");

		usuarios = usuarioService.buscar(buscar, perfil, provincia, municipio,
				s);
		totalRes = usuarios.size();
	}

	/**
	 * Método para seleccionar a un usuario para su eliminación.
	 */
	public void eliminar(Usuario usuario) {
		usuarioElim = usuario;
	}

	/**
	 * Método para eliminar un usuario
	 */
	public void eliminar() {

		if (usuarioElim != null) {
			if (usuarioElim.getM_comites() != null
					&& usuarioElim.getM_comites().size() > 0) {
				Set<Comite> lCom = usuarioElim.getM_comites();
				Object[] aCom = lCom.toArray();

				for (int i = 0; i < lCom.size(); i++) {
					Comite com = (Comite) aCom[i];
					com.getM_tecnicos().remove(usuarioElim);

					comiteService.save(com);
				}

				usuarioElim.setM_comites(null);
			}
			if (usuarioElim.getM_eqMantenimiento() != null
					&& usuarioElim.getM_eqMantenimiento().size() > 0) {

				Set<EqMantenimiento> lEqM = usuarioElim.getM_eqMantenimiento();
				Object[] aEqM = lEqM.toArray();

				for (int i = 0; i < lEqM.size(); i++) {
					EqMantenimiento equ = (EqMantenimiento) aEqM[i];
					equ.getM_tecnicos().remove(usuarioElim);

					eqMantenimientoService.save(equ);
				}

				usuarioElim.setM_eqMantenimiento(null);
			}

			boolean b = usuarioService.delete(usuarioElim.getId());
			if (b) {
				FacesMessages
						.instance()
						.add(
								"El usuario seleccionado se ha eliminado del sistema correctamente.");
			} else {
				FacesMessages.instance().add(
						"El usuario no ha podido ser eliminado del sistema.");
			}
		}

	}

	/**
	 * Método que sirve para limpiar los datos de un formulario
	 */
	public void limpiar() {
		buscar = null;
		en = 1;
		provincia = null;
		municipio = null;
		listaMunicipios = null;
		totalRes = 0;
		usuarios = null;
	}

	/**
	 * Método para inicializar los parámetros para volver al menú de usuarios
	 */
	@End
	public void volver() {
		limpiar();
	}

	/**
	 * Método para inicializar los parámetros para volver al menú principal
	 */
	@End
	public void menu() {
		limpiar();
	}

	/*
	 * getters and setters
	 */

	/**
	 * @return
	 */
	public int getModo() {
		return modo;
	}

	/**
	 * 
	 * @param modo
	 */
	public void setModo(int modo) {
		this.modo = modo;
	}

	/**
	 * 
	 * @return
	 */
	public String getBuscar() {
		return buscar;
	}

	/**
	 * 
	 * @param buscar
	 */
	public void setBuscar(String buscar) {
		this.buscar = buscar;
	}

	/**
	 * 
	 * @return
	 */
	public int getEn() {
		return en;
	}

	/**
	 * 
	 * @param en
	 */
	public void setEn(int en) {
		this.en = en;
	}

	/**
	 * 
	 * @return
	 */
	public ProvinciaDic getProvincia() {
		return provincia;
	}

	/**
	 * 
	 * @param provincia
	 */
	public void setProvincia(ProvinciaDic provincia) {
		this.provincia = provincia;
	}

	/**
	 * 
	 * @return
	 */
	public MunicipioDic getMunicipio() {
		return municipio;
	}

	/**
	 * 
	 * @param municipio
	 */
	public void setMunicipio(MunicipioDic municipio) {
		this.municipio = municipio;
	}

	/**
	 * 
	 * @return
	 */
	public PerfilDic getPerfil() {
		return perfil;
	}

	/**
	 * 
	 * @param perfil
	 */
	public void setPerfil(PerfilDic perfil) {
		this.perfil = perfil;
	}

	/**
	 * 
	 * @return
	 */
	public Usuario getUsuarioElim() {
		return usuarioElim;
	}

	/**
	 * 
	 * @param usuarioElim
	 */
	public void setUsuarioElim(Usuario usuarioElim) {
		this.usuarioElim = usuarioElim;
	}

	/**
	 * 
	 * @return
	 */
	public int getTotalRes() {
		return totalRes;
	}

	/**
	 * 
	 * @param totalRes
	 */
	public void setTotalRes(int totalRes) {
		this.totalRes = totalRes;
	}

	/**
	 * 
	 * @return
	 */
	public List<ProvinciaDic> getListaProvincias() {
		return listaProvincias;
	}

	/**
	 * 
	 * @param listaProvincias
	 */
	public void setListaProvincias(List<ProvinciaDic> listaProvincias) {
		this.listaProvincias = listaProvincias;
	}

	/**
	 * 
	 * @return
	 */
	public List<MunicipioDic> getListaMunicipios() {
		if (provincia != null) {
			listaMunicipios = municipioService.getList(provincia);
		}
		return listaMunicipios;
	}

	/**
	 * 
	 * @param listaMunicipios
	 */
	public void setListaMunicipios(List<MunicipioDic> listaMunicipios) {
		this.listaMunicipios = listaMunicipios;
	}

	/**
	 * 
	 * @return
	 */
	public List<PerfilDic> getListaPerfiles() {
		return listaPerfiles;
	}

	/**
	 * 
	 * @param listaPerfiles
	 */
	public void setListaPerfiles(List<PerfilDic> listaPerfiles) {
		this.listaPerfiles = listaPerfiles;
	}

	/**
	 * 
	 * @return
	 */
	public List<Usuario> getUsuarios() {
		return usuarios;
	}

	/**
	 * 
	 * @param usuarios
	 */
	public void setUsuarios(List<Usuario> usuarios) {
		this.usuarios = usuarios;
	}

	/**
	 * 
	 * @return
	 */
	public Usuario getUsuarioItem() {
		return usuarioItem;
	}

	/**
	 * 
	 * @param usuarioItem
	 */
	public void setUsuarioItem(Usuario usuarioItem) {
		this.usuarioItem = usuarioItem;
	}

}
